<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <script>
    // function add(x) {
    //     // 使用了闭包保存了当前的累加值，每次调用都能返回新函数访问和共享这个sum
    //   let sum = x;

    // //   返回内部函数，可以累加传入的参数到sum，继续返回自身以接收链式调用
    //   const curriedAdd = function (y) {
    //     sum += y;
    //     return curriedAdd;
    //   };

    // //   这里重新valueOf是为了在函数运行的时候做隐式类型的转换，还有在需要数值上下文的时候会调用valueOf这个方法
    //   curriedAdd.valueOf = function () {
    //     return sum;
    //   };

    //   return curriedAdd;
    // }
    // console.log(add(1)(2)(3));

    // const a1 = add(1);
    // const a2 = a1(2);
    // const a3 = a2(3);
    // console.log('a3: ', a3);
    // console.log(a3 == 6); //

    function add(x) {
      let sum = x;

      const curriedAdd = function (y) {
        sum += y;

        return curriedAdd;
      };
      // js引擎自动触发
      curriedAdd.valueOf = function () {
        return sum;
      };

      curriedAdd.value = function () {
        return sum;
      };

      curriedAdd.toString = function () {
        return sum.toString();
      };

      Object.freeze(curriedAdd);

      return curriedAdd;
    }

    console.log(add(1)(2)(3));

    const a1 = add(1);
    const a2 = a1(2);
    const a3 = a2(3);
    console.log('a3: ', a3, a3.value());
    console.log(a3 == 6); //
    console.log(a3 > a2); //
  </script>
  <body></body>
</html>
